/*
 * @Descripttion: Lutongli代码
 * @version: 1.0.0
 * @Author: LutongLi
 * @Date: 2025-05-28 08:02:24
 * @LastEditTime: 2025-06-02 01:36:05
 */
package host

import (
	"context"
	"time"

	"github.com/go-playground/validator/v10"
)

type Vendor int

const(
	//枚举的默认值
	_ Vendor = iota
	//私有云
	Private_Idc
	//阿里云
	AliYun
	//腾讯云
	TenCentYun
	HuaWei
)

type Resource struct{
	Id string `json:"id" validate:"required"`	//全局唯一ID
	Vendor Vendor	`json:"vendor"` //厂商
	Region string `json:"region" validate:"required"` //地域
	CreateAt int64 `json:"create_at"` //创建时间
	ExpireAt int64 `json:"expire_at"` //过期时间
	Type string `json:"type" validate:"required"`	//规格
	Name string `json:"name" validate:"required"`	//名称
	Description string `json:"description"` //描述
	// Status string `json:"status"` //服务商中的状态
	// Tags map[string]string `json:"tags"`	//标签
	UpdateAt int64 `json:"update_at"`  //更新时间
	SyncAt int64 `json:"sync_at"` 	//同步时间	
	Account string `json:"account"`  //资源所属账号
	PublicIp 	string 	`json:"public_ip"` //公网IP
	// PayType		string  `json:"pay_type"` //实例付费方式
}

//describe主要是用来描述实体的
type Describe struct{
ResourceID string `json:"resource_id"`
CPU	int `json:"cpu" validate:"required"`		//cpu核数
Memory	int `json:"memory" validate:"required"`	//内存
GPUAmount	int `json:"gpu_amount"` //GPU数量
GPUSpec	string `json:"gpu_spec"`	//GPU内型
OSType	string `json:"os_type"`		//操作系统类型
OSName	string `json:"os_name"`		//操作系统名称
SerialNumber	string `json:"serial_number"`	//序列号
}

type Host struct{
	//资源共同属性部分
	*Resource
	//资源独有属性部分
	*Describe
}

func NewHost() *Host{
	return &Host{
		Resource: &Resource{},
		Describe: &Describe{},
	}
}

func(h *Host)Validate() error {
	validate := validator.New()
	return validate.Struct(h)
}

func(h *Host)InjectDefault(){
	if h.CreateAt == 0 {
		h.CreateAt = time.Now().UnixMilli()
	}
	if h.UpdateAt == 0 {
		h.UpdateAt = time.Now().UnixMilli()
	}

}

//查询host的数据结构
type QueryHostRequest struct{}
//更新host的数据结构
type UpdateHostRequest struct{
	//只允许更新describe的信息
	*Describe
}
//删除host的数据结构
type DeleteHostREquest struct{
	//删除一般只需要一个id就行
	Id string `json:"id"`
}

type HostSet struct{
	Items []*Host
	Total int
}

type Service interface {
	//创建主机
	CreateHost(context.Context,*Host)(*Host,error)
	//查询主机列表
	QueryHost(context.Context,*QueryHostRequest)(*HostSet,error)
	//查询主机详情
	DescribeHost(context.Context,*QueryHostRequest)(*Host,error)
	//更新主机
	UpdateHost(context.Context,*UpdateHostRequest)(*Host,error)
	//删除主机
	DeleteHost(context.Context,*DeleteHostREquest)(*Host,error)
	//返回的信息主要是前端需要操作对象的信息
}